home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #2 / Ham Radio 2000 - Volume 2.iso / HAMV2 / TCP_IP / HAGEMAN / PIC_CODE / ANALYZER.C next >
C/C++ Source or Header  |  1997-10-07  |  8KB  |  423 lines

  1. //==================================================================
  2. //=====                                   =====
  3. //=====        Network Analyzer PIC Interface Program          =====
  4. //=====            By: Steve Hageman 12Jan97                   =====
  5. //=====                                   =====     
  6. //==================================================================
  7. //=====  Version: 1.1 - Initial Release, 70% ROM Used  12Jan97 =====
  8. //=====           2.0 - Changed the return 'OK' to '*' 16Feb97 =====
  9. //=====                 to speed things up - 66% ROM Used      =====
  10. //=====           2.1 - I took the easy way out and swapped pin=====
  11. //=====                 B3,B4 to match the schematic, this     =====
  12. //=====                 does not match my prototype, but it    =====
  13. //=====                 does match the ARRL schematic. 4Oct97  =====
  14. //==================================================================
  15.  
  16. //-----< Initilization code >---------------------------------------
  17.  
  18. //----- Include Files -----
  19. #include <16c71.h>
  20. #include <stdio.h>
  21.  
  22. //----- Compiler use statements -----
  23. #use delay(clock=4000000)
  24. #use rs232(baud=9600, xmit=PIN_B7, rcv=PIN_A4, invert)
  25.  
  26. //----- RS232 pins -----
  27. #define RS232_OUT    PIN_B7
  28. #define RS232_IN    PIN_A4
  29.  
  30. //----- Port defines -----
  31. #define TRIS_A      0x85
  32. #define TRIS_B      0x86
  33. #define PORT_A_REG  0x05
  34. #define PORT_B_REG  0x06
  35. #define FSR         0x04
  36.  
  37. //----- Pin defines -----
  38. #pragma byte port_a = 0x05
  39. #pragma byte port_b = 0x06
  40.  
  41. //----- DDS Chip Pins (45102) -----
  42. #pragma bit SDATA = port_b.0
  43. #pragma bit SCLK = port_b.1
  44. #pragma bit XFER = port_b.2
  45.  
  46. //----- DDS Attenuator ------
  47. #pragma bit SOURCE_ATTEN_A = port_b.3
  48. #pragma bit SOURCE_ATTEN_B = port_b.4
  49.  
  50. //----- Receiver Attenuators -----
  51. #pragma bit REFLECTION_ATTEN   = port_b.5
  52. #pragma bit TRANSMISSION_ATTEN = port_b.6
  53.  
  54. //-----< General Defines >-----
  55. #define DOOMSDAY    0    // Not here yet!
  56.  
  57. //----- Analog A/D Channel Mapping -----
  58. #define REF_CHAN    0    
  59. #define THRU_CHAN    1
  60. #define PHASE_CHAN    2
  61.  
  62. //-----< Global Variables >-----
  63. char Buf;    // RS232 receive char
  64.  
  65. //-----< Subroutines >------------------------------------------------
  66. void set_dds_frequency(void)
  67. {
  68.     //----- Read RS232 and set frequency -----
  69.  
  70.     // Loop and shift each bit into the DDS chip
  71.     while(!DOOMSDAY)
  72.     {
  73.         // Inner loop as long as char != 'E'
  74.         Buf = getc(); 
  75.                                             
  76.         // If this char is a E that means end
  77.         switch(Buf)
  78.         {
  79.             case 'E':
  80.             {
  81.                 // XFER Data to DDS chip output register
  82.                 XFER = 0;
  83.                 XFER = 1;
  84.             
  85.                 // Write OK back to calling program
  86.                 puts("*");
  87.                 return;
  88.             }
  89.         
  90.             // Write a one bit to the DDS
  91.             case '1':
  92.             {
  93.                 SDATA = 1;
  94.                 SCLK = 1;
  95.                 SCLK = 0;
  96.                 SDATA = 0;
  97.                 PUTS("*");
  98.                 break;
  99.             }
  100.             
  101.             // Write a zero bit to the DDS
  102.             case '0':
  103.             {
  104.                 SDATA = 0;
  105.                 SCLK = 1;
  106.                 SCLK = 0;
  107.                 PUTS("*");
  108.                 break;
  109.             }
  110.             
  111.             // Error
  112.             default:
  113.             {
  114.                 puts("ERROR");
  115.                 return;
  116.             }
  117.  
  118.         } // End of switch
  119.  
  120.     } // End of while
  121.  
  122.  
  123. void set_dds_attenuator()
  124. {
  125.     // Read setting from RS232
  126.     Buf = getc(); 
  127.         
  128.     // Set DDS Attenuator
  129.     switch(Buf) {
  130.  
  131.         case '1': {
  132.             // 5 dBv Max power
  133.             SOURCE_ATTEN_A = 1;
  134.             SOURCE_ATTEN_B = 1;
  135.             break;
  136.         }        
  137.         case '2': {
  138.             // 0 dBv
  139.             SOURCE_ATTEN_A = 0;
  140.             SOURCE_ATTEN_B = 0;
  141.             break;
  142.         }
  143.         case '3': {
  144.             // -20 dBv
  145.             SOURCE_ATTEN_A = 1;
  146.             SOURCE_ATTEN_B = 0;
  147.             break;
  148.         }
  149.         case '4': {
  150.             // -40 dBv
  151.             SOURCE_ATTEN_A = 0;
  152.             SOURCE_ATTEN_B = 1;
  153.             break;
  154.         }
  155.         default: {
  156.             // Error
  157.             puts("ERROR");
  158.             return;        
  159.         }
  160.     
  161.     }
  162.     // Send OK back
  163.     puts("*");
  164. }
  165.  
  166.  
  167. read_send_channel(int chan)
  168. {
  169. int value;
  170.  
  171.     // Set the A/D Channel, Wait for settling delay
  172.     set_adc_channel(chan);
  173.     delay_us(10);
  174.     
  175.     // Read the specified A/D channel
  176.     value = read_adc();
  177.     
  178.     // Send result back on RS232 as decimal, ASCII value
  179.     putc( (value/100) + '0' );
  180.     putc( ((value/10) % 10) + '0');
  181.     putc( (value%10) + '0');
  182. }
  183.  
  184.  
  185. set_attenuator(int chan)
  186. {
  187.     // Read setting from RS232
  188.     Buf = getc();
  189.     
  190.     // Set attenuator as needed
  191.     switch(Buf) 
  192.     {
  193.         case '1':
  194.         {
  195.             // NOTE: A one means close relay
  196.             // setting attenuator OFF
  197.             if(chan == REF_CHAN)
  198.             {
  199.                 REFLECTION_ATTEN = 0;
  200.             }
  201.             else
  202.             {
  203.                 TRANSMISSION_ATTEN = 0;
  204.             }
  205.             break;
  206.         }
  207.     
  208.         case '0':
  209.         {
  210.             // Set attenuator OFF
  211.             if(chan ==  REF_CHAN)
  212.             {
  213.                 REFLECTION_ATTEN = 1;
  214.             }
  215.             else
  216.             {
  217.                 TRANSMISSION_ATTEN = 1;
  218.             }
  219.             break;
  220.         }    
  221.         
  222.         default: {
  223.             // Error
  224.             puts("ERROR");
  225.             return;        
  226.         }    
  227.     
  228.     } // End of switch
  229.     
  230.     // Send OK back
  231.     puts("*");
  232. }
  233.  
  234.  
  235. //-----< Main >----------
  236. void main(void)
  237. {
  238.  
  239.     // Setup Ports
  240.     #asm
  241.         clrf PORT_B_REG     // Clear port b
  242.         
  243.         movlw TRIS_B        // Setup port B TRIS reg
  244.         movwf FSR
  245.         
  246.         // Set 0-7 bits all output 
  247.         bcf 00,0    // SData        
  248.         bcf 00,1    // SClock
  249.         bcf 00,2    // XFER#
  250.         bcf 00,3    // DDS Range Pin A
  251.         bcf 00,4    // DDS Range Pin B
  252.         bcf 00,5    // Ref Range Relay
  253.         bcf 00,6    // Thru Range Relay
  254.         bcf 00,7    // RS232 Output
  255.     #endasm
  256.     
  257.     // Setup A/D
  258.     setup_port_a(ALL_ANALOG);
  259.     setup_adc(ADC_CLOCK_DIV_8);    // OK for 4 MHz Clock
  260.     
  261.     // Set output source attenuator to 0 dBm
  262.     SOURCE_ATTEN_A = 1;
  263.     SOURCE_ATTEN_B = 0;
  264.  
  265.     // Set receiver attenuators ON
  266.     REFLECTION_ATTEN   = 0;
  267.     TRANSMISSION_ATTEN = 0;
  268.     
  269.     // Set initial program start DDS State
  270.     SCLK = 0;
  271.     SDATA = 0;
  272.     XFER = 1;
  273.     
  274.     // Initilize RS232 pin, send a 0. 
  275.     // This sets up the RS232 properly
  276.     putc(' ');
  277.     
  278.     // Main loop
  279.     while(!DOOMSDAY)
  280.     {
  281.         // Wait for RS232 char -> parse to command
  282.         Buf = getc();
  283.         
  284.         switch(Buf)
  285.         {
  286.         
  287.             // DDS Source Parser
  288.               case 'S': {
  289.                   
  290.                   puts("*");
  291.                   
  292.                   // Get next char
  293.                   Buf = getc();
  294.                   
  295.                   switch(Buf) {
  296.                   
  297.                       case 'F':
  298.                       {    
  299.                           puts("*");
  300.                           // Set frequency command
  301.                           set_dds_frequency();
  302.                           break;
  303.                       }                              
  304.                   
  305.                       case 'A':    
  306.                       {
  307.                           puts("*");        
  308.                           // Set attenuator command
  309.                           set_dds_attenuator();
  310.                           break;
  311.                       }
  312.                       
  313.                       default:
  314.                       {
  315.                           puts("ERROR");
  316.                       }    
  317.                   } 
  318.                   break;
  319.               }
  320.               
  321.               // Ref Chan Parser
  322.               case 'R': {
  323.                   
  324.                   puts("*");
  325.                   
  326.                   // Get next char
  327.                   Buf = getc();
  328.               
  329.                   switch(Buf) {
  330.                   
  331.                       case '?':
  332.                       {    
  333.                           puts("*");
  334.                           // Read channel command
  335.                           read_send_channel(REF_CHAN);
  336.                           break;
  337.                       }                              
  338.                       case 'A':    
  339.                       {
  340.                           puts("*");
  341.                           // Set attenuator command
  342.                           set_attenuator(REF_CHAN);
  343.                           break;
  344.                       }
  345.                       default:
  346.                       {
  347.                           puts("ERROR");
  348.                       }
  349.                   }
  350.                   break;
  351.               }
  352.             
  353.             // Thru Chan Parser
  354.               case 'T': {
  355.               
  356.                   puts("*");
  357.                   
  358.                   // Get next char
  359.                   Buf = getc();
  360.               
  361.                   switch(Buf) {
  362.                   
  363.                       case '?':
  364.                       {    
  365.                           puts("*");
  366.                           // Read channel command
  367.                           read_send_channel(THRU_CHAN);
  368.                           break;
  369.                       }                              
  370.                       case 'A':    
  371.                       {
  372.                           puts("*");
  373.                           // Set attenuator command
  374.                           set_attenuator(THRU_CHAN);
  375.                           break;
  376.                       }
  377.                       default:
  378.                       {
  379.                           puts("ERROR");
  380.                       }
  381.                   }
  382.               break;
  383.               }
  384.               
  385.             // Phase Chan Parser
  386.               case 'P': {
  387.               
  388.                   puts("*");
  389.                   
  390.                   // Get next char
  391.                   Buf = getc();
  392.                 
  393.                 switch(Buf) {
  394.                           
  395.                       case '?':
  396.                       {    
  397.                           puts("*");
  398.                           // Read channel command
  399.                           read_send_channel(PHASE_CHAN);
  400.                           break;
  401.                       }
  402.                       
  403.                       default:
  404.                       {
  405.                           puts("ERROR");
  406.                       }
  407.                   }
  408.               break;                                  
  409.             }              
  410.             
  411.             // Not in command list
  412.             default: {
  413.                 // Error
  414.                 puts("ERROR");
  415.             }
  416.         
  417.         } // End of switch
  418.  
  419.     } // End of while
  420.  
  421. } //----- End of main -----
  422.